import geopandas as gpd

# --- 配置 ---
# 输入的原始 GeoJSON 文件路径
input_geojson_path = 'data/DjiAreas4_CN.geojson'

# 输出的简化后的 GeoJSON 文件路径
output_geojson_path = 'data/DjiAreas4_CN_simple.geojson'

# 简化的容差值 (tolerance)
# 对于 EPSG:4326 (WGS84) 坐标系，单位是度
tolerance = 0.01

# --- 处理流程 ---

# 1. 使用 GeoPandas 读取 GeoJSON 文件
print(f"正在读取文件: {input_geojson_path}...")
gdf = gpd.read_file(input_geojson_path)

print(f"读取完成。共 {len(gdf)} 个要素。")
print("原始数据的坐标参考系 (CRS):", gdf.crs)

# 2. 简化几何图形
print(f"开始简化几何图形，容差值为: {tolerance}...")
# 创建一个新的 GeoDataFrame，而不是在原地修改
simplified_gdf = gdf.copy()

# 对所有几何类型进行简化（Point 类型不会被简化）
simplified_gdf['geometry'] = gdf.geometry.simplify(tolerance=tolerance, preserve_topology=True)

# 需要分别处理不同类型的几何对象
def count_vertices(geometries):
    total_points = 0
    for geom in geometries:
        if geom.geom_type == 'Polygon':
            # 多边形：计算外环顶点数
            total_points += len(geom.exterior.coords)
        elif geom.geom_type == 'MultiPolygon':
            # 多个多边形：计算所有外环顶点数
            for poly in geom.geoms:
                total_points += len(poly.exterior.coords)
        elif geom.geom_type == 'Point':
            # 点：计为1个顶点
            total_points += 1
        elif geom.geom_type == 'LineString':
            # 线：计算顶点数
            total_points += len(geom.coords)
        elif geom.geom_type == 'MultiPoint':
            # 多点：计算点数
            total_points += len(geom.geoms)
        elif geom.geom_type == 'MultiLineString':
            # 多线：计算所有线的顶点数
            for line in geom.geoms:
                total_points += len(line.coords)
    return total_points

try:
    original_points = count_vertices(gdf.geometry)
    simplified_points = count_vertices(simplified_gdf.geometry)
    print(f"原始顶点总数: {original_points}")
    print(f"简化后顶点总数: {simplified_points}")
    if original_points > 0:
        reduction_percent = (1 - simplified_points / original_points) * 100
        print(f"顶点数量减少了: {reduction_percent:.2f}%")
except Exception as e:
    print(f"计算顶点数量时出错: {e}")

# 3. 将简化后的 GeoDataFrame 保存为新的 GeoJSON 文件
print(f"正在保存简化后的文件到: {output_geojson_path}...")
simplified_gdf.to_file(output_geojson_path, driver='GeoJSON')

print("处理完毕！")
